const fs = require('fs');
const path = require('path');

/**
 * 更精确地解析Config.ts文件中的scriptDeps配置
 * @param {string} configPath Config.ts文件路径
 * @returns {string[]} 依赖的子包列表
 */
function parseSubpkgConfig(configPath) {
  try {
    const content = fs.readFileSync(configPath, 'utf8');
    
    // 移除注释和多余空格
    const cleanContent = content
      .replace(/\/\*[\s\S]*?\*\//g, '') // 移除多行注释
      .replace(/\/\/.*$/gm, '') // 移除单行注释
      .replace(/\s+/g, ' '); // 合并多个空格
    
    // 使用更精确的正则表达式匹配scriptDeps
    const scriptDepsMatch = cleanContent.match(/scriptDeps:\s*\[([^\]]*)\]/);
    
    if (scriptDepsMatch) {
      const depsStr = scriptDepsMatch[1];
      
      // 解析数组中的字符串，支持引号包围的字符串
      const deps = depsStr
        .split(',')
        .map(dep => {
          const trimmed = dep.trim();
          // 移除引号
          return trimmed.replace(/^['"`]|['"`]$/g, '');
        })
        .filter(dep => dep.length > 0);
      
      return deps;
    }
  } catch (error) {
    console.warn(`无法读取配置文件: ${configPath}`, error.message);
  }
  return [];
}

/**
 * 验证子包配置文件的格式
 * @param {string} configPath Config.ts文件路径
 * @returns {boolean} 是否为有效的配置文件
 */
function validateSubpkgConfig(configPath) {
  try {
    const content = fs.readFileSync(configPath, 'utf8');
    
    // 检查是否包含必要的结构
    const hasSubpkgMgrImport = content.includes('SubpkgMgr');
    const hasRegisterCall = content.includes('registerSubpkgConfig');
    const hasScriptDeps = content.includes('scriptDeps');
    
    return hasSubpkgMgrImport && hasRegisterCall && hasScriptDeps;
  } catch (error) {
    return false;
  }
}

/**
 * 获取子包的完整配置信息
 * @param {string} configPath Config.ts文件路径
 * @returns {Object|null} 子包配置对象
 */
function getSubpkgFullConfig(configPath) {
  try {
    const content = fs.readFileSync(configPath, 'utf8');
    
    // 提取name
    const nameMatch = content.match(/name:\s*["']([^"']+)["']/);
    const name = nameMatch ? nameMatch[1] : null;
    
    // 提取scriptDeps
    const scriptDeps = parseSubpkgConfig(configPath);
    
    // 提取protoFiles
    const protoFilesMatch = content.match(/protoFiles:\s*\[([^\]]*)\]/);
    const protoFiles = protoFilesMatch 
      ? protoFilesMatch[1]
          .split(',')
          .map(file => file.trim().replace(/['"`]/g, ''))
          .filter(file => file.length > 0)
      : [];
    
    return {
      name,
      scriptDeps,
      protoFiles,
      configPath
    };
  } catch (error) {
    console.warn(`无法解析配置文件: ${configPath}`, error.message);
    return null;
  }
}

module.exports = {
  parseSubpkgConfig,
  validateSubpkgConfig,
  getSubpkgFullConfig
}; 